//
//  Status.swift
//  CLWeiBo
//
//  Created by 程雷 on 15/6/30.
//  Copyright © 2015年 程雷. All rights reserved.
//

import UIKit
import SDWebImage

// 访问微博首页
private let WB_Home_TimeLine_URL = "2/statuses/home_timeline.json"

class Status: NSObject {

    // MRAK ---数据模型属性
///  微博创建时间
    var created_at :String?
    /// 微博 id
    var id :Int = 0
///  微博信息
    var text:String?
///  微博来源
    var source: String?{
        didSet {
            if let result = source?.herfLink() {
                source = result.text
            }
        }
    }
///  配图数组
    var pic_urls:[[String:String]]?
    {
        didSet{
            // 设置 图像 URL 的数组
            imageURLs = [NSURL]()
            largeImageURLs = [NSURL]()
            //生成并添加 url
            for dict in pic_urls! {
                var urlString = dict["thumbnail_pic"]!
                // 缩略图
                imageURLs?.append(NSURL(string: urlString)!)
            urlString = urlString.stringByReplacingOccurrencesOfString("thumbnail",withString:"large")
                // 大图url
                largeImageURLs?.append(NSURL(string: urlString)!)
            }
        }
        
    }
    /// 配图的 URL 数组
    private var imageURLs :[NSURL]?
    // 如果只是转发微博，只需要缓存转发微博的 imageURLs,原创的imageURLs为 nil
    //如果是原创微博， 有可能imageURLs 有值
    var picURLs:[NSURL]?{
        return retweeted_status != nil ? retweeted_status?.imageURLs:imageURLs
    }
    
    private var largeImageURLs: [NSURL]?
    var largePicURLs :[NSURL]? {
        return retweeted_status != nil ? retweeted_status?.largeImageURLs :largeImageURLs
    }
    
///  用户模型
    var user:User?
 /// 被转发原微博信息字段，当该微博为转发微博时返回
    var retweeted_status:Status?
    
///  类型数组
    static let properties = ["created_at","id","text","source","pic_urls","user","retweeted_status"]

    ///  字典转模型函数
    // 在 swift 中 kvc 的效率特别差
    init(dict: [String: AnyObject])
    {
        super.init()
        for key in Status.properties
        {
            // 判断字典中的key对应的 值是否存在
            if dict[key] == nil || key == "user" || key == "retweeted_status"
            {
                continue
            }
            //如果存在，使用 kvc 设置数值，使用之前需要调用super.init() 初始化对象属性
            setValue(dict[key], forKey: key)
        }
        //判断字典中是否包含 user
        if let userDict = dict["user"] as? [String:AnyObject]
        {
            // 给 user 属性设置数值
            user = User(dict:userDict)
        }
        //判断字典中是否含后 retweeted_status
        if let retweetedDict = dict["retweeted_status"] as? [String:AnyObject]
        {
            retweeted_status = Status(dict: retweetedDict)
        }
    }
    
    override var description:String{
        let dict = dictionaryWithValuesForKeys(Status.properties)
        return "\(dict)"
    }
    //加载数据
    /**
    since_id  若制定参数 则返回 id 比since_id大的微博 （即比since_id时间晚的微博），默认为 0 
    max_ID 若制定参数 则返回 ID小于或等于 max_id 的微博 默认 0
    */
    class func loadStatus(since_id:Int,max_id:Int,finished: (Status: [Status]?,error:NSError?)->()) {
        // 断言 ，不过就不让往下执行
        assert(sharedUserAccount != nil,"必须登录之后才能访问网络")
        
        // 自动推导的字典类型 是 ［String:String］
        var params = ["access_token":sharedUserAccount!.access_token]
        if since_id > 0
        {
            params["since_id"] = "\(since_id)"
        }
        
        if max_id > 0
        {
            params["since_id"] = "0"
            params["max_id"] = "\(max_id-1)"
        }
        // 发起网络请求 异步加载数据
        
        NetWorkTools.sharedNetworkTools().GET(WB_Home_TimeLine_URL, parameters: params, success: { (_, JSON) -> Void in
            
            // 从结果中获取微博的数组
            if let array = JSON["statuses"] as? [[String: AnyObject]] {
                // 1.获得微博模型的数组
                let list = statuses(array)
                
                // 2.异步缓存微博数组中的所有图像
                cacheWebImages(list,finished:finished)
                return
            }
            // 回调空数据，解析失败或者其他失败原因
            finished(Status: nil, error: nil)
            }) { (_, error) -> Void in
                //print 函数一定要保留，这样如果出错可以清楚的得知是哪个地方出错
                print(error)
                // 回调通知错误
                finished(Status: nil, error: nil)
        }
    }
    /// 缓存微博数组中的所有图像
    ///缓存完所有图片之后，再告诉调用方 更新界面
    /**
    要解决的知识点 所有图片“被缓存完成后”，统一回调
    知识点 调度组 dispatch_group_enter
    */
    private class func cacheWebImages(list:[Status],finished:([Status]?,error:NSError?) ->())
    {
        // 0 调度组
        let group = dispatch_group_create()
        // 1. 遍历数组
        for element in list{
            // 判断 picURLs 是否有内容
            if element.picURLs == nil || element.picURLs!.isEmpty{
                continue
            }
            print(element.imageURLs)
            
            // 进一步遍历picURLs 缓存数组中的图片
            for url in element.picURLs! {
                // 进入组，后续的 block 代码会受group的监听
                dispatch_group_enter(group)
                
                // 用 SDWebImage 缓存图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed:{(_,_,_,_,_) in
                    //代码执行到这里，图片已经缓存完了
                    // 离开组
                    dispatch_group_leave(group)
                    
                })
            }
        }
        
        //监听群组调用
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            
            //完成回调
            finished(list,error:nil)
        }
    }
///  使用传入的数组。完成网络模型转 Status 数组
    
    private class func  statuses(array: [[String:AnyObject]]) ->[Status] {
        // 定义可变数组
        
        var arrayM = [Status]()
        //遍历 array
        for dict in array
        {
            arrayM.append(Status (dict: dict))
        }
        return arrayM
        
        
        
    }
}
